/* This file was created by Nokia Developer's Suite for J2ME(TM) */
import java.util.Date;
import java.io.*;

import localization.Language;
import localization.LocalizationManager;

public class TimeTable 
{
	private static final Language language = LocalizationManager.getCurrentLanguageFromInstance();	
	
    public static final int DAY_LESSONS = 8; //ilosc pol na dzien
    public static final int WEEK_DAYS = 5;   //ilosc dni na tydzien
    
    private String m_sName;  //nazwa planu
    private boolean[] m_bFull = new boolean[DAY_LESSONS * WEEK_DAYS];   //tablica czy pole jest zajete
    private String[] m_sLesson = new String[DAY_LESSONS * WEEK_DAYS];   //tablice pol w tygodniu
    private String[] m_sRoom = new String[DAY_LESSONS * WEEK_DAYS];
    private String[] m_sComment = new String[DAY_LESSONS * WEEK_DAYS];
    private Date[] m_start = new Date[DAY_LESSONS * WEEK_DAYS];
    private Date[] m_end = new Date[DAY_LESSONS * WEEK_DAYS];
    
    
	public TimeTable( String newName ) //Przygotowuje pusty rozklad o podanej nazwie
	{
        m_sName= newName;
	}
    
    public TimeTable( byte[] input ) //Tworzy rozklad z tablicy bajtow (do wgrywania)
    {
        ByteArrayInputStream byteInput = new ByteArrayInputStream( input );
        DataInputStream dataInput = new DataInputStream( byteInput );
        
        try{
            m_sName= dataInput.readUTF(); //odczytuje nazwe
        
            for( int i=0; i< DAY_LESSONS * WEEK_DAYS; i++ )
            {
                m_bFull[i]= dataInput.readBoolean(); //odczytuje tablice zapelnienia
            }
            
            for( int i=0; i< DAY_LESSONS * WEEK_DAYS; i++ )
            {
                if( m_bFull[i])
                {
                    m_sLesson[i]= dataInput.readUTF(  ); //odczytuje przedmiot
                    m_sRoom[i]=   dataInput.readUTF(  ); //odczytuje sale
                    m_sComment[i]=dataInput.readUTF(  ); //odczytuje komentarz
                    m_start[i]= new Date( dataInput.readLong( ) ); //odczytuje godzine rozpoczecia
                    m_end[i]=new Date(dataInput.readLong( ) ); //odczytuje godzine rozpoczecia
                }
            }//koniec petli zapisujacej poszczegolne miejsca w tablicy
            
            dataInput.close();
            byteInput.close();
        }catch( IOException e ){}
    }

	public void SetName( String newName )
	{
        m_sName= newName;
	}
    
    //ustawia komorke na zadane wartosci
    public void SetCell( int num, String newLesson, String newRoom, String newComment, Date newStart, Date newEnd )
    {
        m_bFull[num]= true;
        m_sLesson[num]= newLesson;
        m_sRoom[num]= newRoom;
        m_sComment[num]= newComment;
        m_start[num]= newStart;
        m_end[num]= newEnd;        
    }
    
    //usuwa podana komorke
    public void DeleteCell( int num )
    {
        m_bFull[num]= false;
    }
    
    //funkcje do pobierania zawartosci poszczegolnych pol
    public String GetName()
    {
        return m_sName;
    }
    
    public String GetLesson( int num )
    {
        if( !m_bFull[num] ) return null;
        return m_sLesson[num];
    }
    
    public String GetRoom( int num )
    {
        if( !m_bFull[num] ) return null;
        return m_sRoom[num];
    }
    
    public String GetComment( int num )
    {
        if( !m_bFull[num] ) return null;
        return m_sComment[num];
    }
    
    public Date GetStart( int num )
    {
        if( !m_bFull[num] ) return null;
        return m_start[num];
    }
    
    public Date GetEnd( int num )
    {
        if( !m_bFull[num] ) return null;
        return m_end[num];
    }
    
    public boolean IsSet( int num ) //czy dane pole jest pelne
    {
        return m_bFull[ num ];
    }
    
    public byte[] ToByteArray() //tworzy tablice bjtow z rozkladu
    {        
        ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
        DataOutputStream dataOutput = new DataOutputStream( byteOutput );
        byte[] wynik= null;
        
        try{
            dataOutput.writeUTF(m_sName); //zapisuje nazwe
            
            for( int i=0; i< DAY_LESSONS * WEEK_DAYS; i++ )
            {
                dataOutput.writeBoolean( m_bFull[i] ); //zapisuje tablice zapelnienia
            }
            
            for( int i=0; i< DAY_LESSONS * WEEK_DAYS; i++ )
            {
                if( m_bFull[i])
                {
                    dataOutput.writeUTF( m_sLesson[i] ); //zapisuje przedmiot
                    dataOutput.writeUTF( m_sRoom[i] ); //zapisuje sale
                    dataOutput.writeUTF( m_sComment[i] ); //zapisuje komentarz
                    dataOutput.writeLong( m_start[i].getTime() ); //zapisuje godzine rozpoczecia
                    dataOutput.writeLong( m_end[i].getTime() ); //zapisuje godzine zakonczenia
                }
            }//koniec petli zapisujacej poszczegolne miejsca w tablicy
    
            dataOutput.flush();
            wynik= byteOutput.toByteArray();
            dataOutput.close();            
            byteOutput.close();
            
        }catch( IOException e )
        {
            throw new RuntimeException( language.getSerializationFailedText()+ " " + e.toString() );
        }

        return wynik;
    }

}